parser grammar ExpresionesParser;

options {
  language = Java;
  tokenVocab = ExpresionesLexer;
  backtrack = true;
}

@header {
  package practica8;
  import java.util.Hashtable;
}

@members {

		Hashtable variables = new Hashtable();
		
		private ArrayList<RecognitionException> errors = new ArrayList<RecognitionException>();
		public ArrayList<RecognitionException> getErrors() {
		   return errors;
		}
		@Override
		public void reportError (RecognitionException e) {
		   String msg = getErrorMessage(e, getTokenNames());
		   System.err.println(msg);
		   errors.add(e);
		}
}


entrada : (instruccion|asignacion)*;


instruccion : e=expr PUNTO_COMA {System.out.println("Expresion: " + e);};

expr returns [int res=0] : e1=exp_mult {res=e1;} ((MAS e2=exp_mult {res=res+e2;})|(MENOS e2=exp_mult {res=res-e2;}))*;

exp_mult returns [int res=0] : e1=exp_base {res=e1;} ((MULT e2=exp_base {res=res*e2;})|(DIV e2=exp_base {res=res/e2;}))*;
catch [ArithmeticException ex] {
   res = 0;
   System.err.println("ERROR: Fallo aritmetico.");
}

exp_base returns [int res=0] : n=NUMERO {res = new Integer(n.getText()).intValue();}
                              |
                               i=IDENT {if (variables.get(i.getText()) != null)
                                           res = (Integer)variables.get(i.getText());
                                        else
                                           res = 0;}
                              |
                               PARENTESIS_A e=expr PARENTESIS_C {res = e;};


asignacion: var=IDENT ASIGNA a=expr PUNTO_COMA {variables.put(var.getText(), a); System.out.println("Asignacion("+var.getText()+"): "+a);};